/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package masterclient;

/**
 *
 * @author Erik
 */

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;

public class GUI extends JFrame implements ActionListener{
    
    //Variabelen van de tabs
    private JTabbedPane tabbedPane;
    private JPanel tabLogin;
    private JPanel tabQuery;
    private JPanel tabAccount;
    private BackupManagement tabBackup;
    private JPanel tabHelp;
    
    //Attributen van het log in tab
    private JLabel labelLogin = new JLabel("Log in");
    private JLabel labelUsername = new JLabel("Username:");
    private JLabel labelPassword = new JLabel("Password:");
    private JTextField fieldUsername;
    private JPasswordField fieldPassword;
    private JButton buttonLogin = new JButton("Log in");
    
    //Attributen van het Query Management tab
    private JLabel labelQuery = new JLabel("Query management");
    private JLabel labelSelectQ = new JLabel("Select query");
    private JButton buttonCreateQ = new JButton("Create new query");
    private JButton buttonActivate = new JButton("Activate/Deactivate");
    private JButton buttonDeleteQ = new JButton("Delete");
    DialoogQueryCreate queryCreate = new DialoogQueryCreate();
    
    //Attributen van het Account Management tab
    private JLabel labelAccount = new JLabel("Account management");
    private JLabel labelSelectA = new JLabel("Select account");
    private JButton buttonCreateA = new JButton("Create new account");
    private JButton buttonEdit = new JButton("Edit");
    private JButton buttonDeleteA = new JButton("Delete");
    DialoogAccountEdit accountEdit = new DialoogAccountEdit();
    DialoogAccountCreate accountCreate = new DialoogAccountCreate();
    
    //Attributen van het Back-up management
    private JLabel labelBackup = new JLabel("Back-up management");
    private JLabel labelSelectB = new JLabel("Select back-up");
    private JComboBox cbox = new JComboBox();
    private JButton buttonCreateB = new JButton("Create new back-up");
    private JButton buttonLoad = new JButton("Load");
    private JButton buttonDeleteB = new JButton("Delete");
    
    //Attributen van het help tab
    private JLabel labelHelp = new JLabel("Help");
    private JTextArea fieldHelp = new JTextArea();
    
    //Constructor
    public GUI(){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //Standaard schermgegevens aanmaken
        setTitle("Masterclient");
        setSize(640, 480);
        setBackground(Color.WHITE);
        setResizable(false);
        
        //Dit zorgt ervoor dat de juiste Tab (de tab waarop geklikt is) wordt weergeven
        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());
        getContentPane().add(topPanel);        
        
        //Het aanroepen van de functies die de tabs aanmaken (in deze functies is het "subscherm" opgebouwd
        createLoginTab();
        createQueryTab();
        createAccountTab();
        createBackupTab();
        createHelpTab();
       
        //De tabbladbar aanmaken
        tabbedPane = new JTabbedPane();
        tabbedPane.addTab("Log in", tabLogin);
        tabbedPane.addTab("Query management", tabQuery);
        tabbedPane.addTab("Account management", tabAccount);
        tabbedPane.addTab("Back-up management", tabBackup);
        tabbedPane.addTab("Help", tabHelp);
        topPanel.add(tabbedPane, BorderLayout.CENTER);
        
        //Toevoegen van de ActionListeners
        buttonCreateA.addActionListener(this);
        buttonCreateQ.addActionListener(this);
        buttonEdit.addActionListener(this);
    }

    //Mehode voor het aanmaken van het login tab
    public void createLoginTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabLogin = new JPanel();
        tabLogin.setLayout(null);
        
        //Label van log in scherm wordt hier toegevoegd
        labelLogin.setBounds(10, 10, 160, 20);
        tabLogin.add(labelLogin);
        
        //Label van username textfield wordt hier toegevoegd
        labelUsername.setBounds(10, 40, 65, 20);
        tabLogin.add(labelUsername);
        
        //Label van password textfield wordt hier toegevoegd
        labelPassword.setBounds(10, 70, 65, 20);
        tabLogin.add(labelPassword);
        
        //Hier wordt het textfield van de username toegevoegd
        fieldUsername = new JTextField(5);
        getFieldUsername().setBounds(80, 40, 100, 20);
        tabLogin.add(getFieldUsername());
        
        //Hier wordt het textfield van het password toegevoegd
        fieldPassword = new JPasswordField(5);
        getFieldPassword().setBounds(80, 70, 100, 20);
        tabLogin.add(getFieldPassword());
        
        //Log in knop wordt hier toegevoegd
        buttonLogin.setBounds(10,100,160,30);
        tabLogin.add(buttonLogin);
    }

    public void createQueryTab() {
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabQuery = new JPanel();
        tabQuery.setLayout(null);
        
        //Label van Query Management scherm wordt hier toegevoegd
        labelQuery.setBounds(10, 10, 160, 20);
        tabQuery.add(labelQuery);
        
        //Button create new query toevoegen
        buttonCreateQ.setBounds(400,30,160,20);
        tabQuery.add(buttonCreateQ);
        
        //Label select wordt hier toegevoegd
        labelSelectQ.setBounds(10, 60, 75, 20);
        tabQuery.add(labelSelectQ);
        
        //Hier wordt het dropdown menu toegevoegd
        //dropdownmenu.setBounds(145, 60, 100, 20);
        //tabQuery.add(dropdownmenu);
        
        //Hier wordt de button Activate/deactivate toegevoegd
        buttonActivate.setBounds(10, 150, 150, 20);
        tabQuery.add(buttonActivate);
        
        //Hier wordt de delete button toegevoegd
        buttonDeleteQ.setBounds(170, 150, 75, 20);
        tabQuery.add(buttonDeleteQ);
    }

    public void createAccountTab() {
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabAccount = new JPanel();
        tabAccount.setLayout(null);
        
        //Label van Account Management scherm wordt hier toegevoegd
        labelAccount.setBounds(10, 10, 160, 20);
        tabAccount.add(labelAccount);
        
        //Button create new account toevoegen
        buttonCreateA.setBounds(400,30,160,20);
        tabAccount.add(buttonCreateA);
        
        //Label select wordt hier toegevoegd
        labelSelectA.setBounds(10, 60, 85, 20);
        tabAccount.add(labelSelectA);
        
        //Hier wordt het dropdown menu toegevoegd
        //dropdownmenu.setBounds(150, 60, 100, 20);
        //tabAccount.add(dropdownmenu);
        
        //Hier wordt de button edit toegevoegd
        buttonEdit.setBounds(10, 150, 150, 20);
        tabAccount.add(buttonEdit);
        
        //Hier wordt de delete button toegevoegd
        buttonDeleteA.setBounds(170, 150, 75, 20);
        tabAccount.add(buttonDeleteA);
    }

    public void createBackupTab() {
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabBackup = new BackupManagement();
        
        //Label van Backup Management scherm wordt hier toegevoegd
        labelBackup.setBounds(10, 10, 160, 20);
        tabBackup.add(labelBackup);
        
        //Button create new backup toevoegen
        buttonCreateB.setBounds(400,30,160,20);
        buttonCreateB.addActionListener(this);
        tabBackup.add(buttonCreateB);
        
        //Label select wordt hier toegevoegd
        labelSelectB.setBounds(10, 60, 85, 20);
        tabBackup.add(labelSelectB);
        
        //Hier wordt het dropdown menu toegevoegd
        cbox.setBounds(150, 60, 250, 20);
        tabBackup.add(cbox);
        addElements(tabBackup.getPath());
        
        //Hier wordt de button load toegevoegd
        buttonLoad.setBounds(10, 150, 150, 20);
        buttonLoad.addActionListener(this);
        tabBackup.add(buttonLoad);
        
        //Hier wordt de delete button toegevoegd
        buttonDeleteB.setBounds(170, 150, 75, 20);
        buttonDeleteB.addActionListener(this);
        tabBackup.add(buttonDeleteB);
    }

    //Mehode voor het aanmaken van het help tab
    public void createHelpTab(){
        //Eerst wordt een nieuw Jpanel aangemaakt, deze is zonder layout, alles wordt dus met coordinaten geplaatst
        tabHelp = new JPanel();
        tabHelp.setLayout(null);
                
        //Toevoegen van de help label
        labelHelp.setBounds(10, 10, 160, 20);
        tabHelp.add(labelHelp);
        
        //Hier wordt de textarea aangemaakt, dit is voor de properties
        fieldHelp.setEditable(false);
        fieldHelp.setText("Hier komt de help tekst te staan, deze tekst wordt automatisch afgebroken en de scrollbar functioneert ook automatisch");
        fieldHelp.setLineWrap(true);
        fieldHelp.setWrapStyleWord(true);
        fieldHelp.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4)); //border wordt aangemaakt voor de scrollbar
        
        //Hier wordt de scrollbar aangemaakt, het textfield wordt aan de scrollbar toegevoegd en daarna wordt deze aangemaakt
        JScrollPane scrollBar = new JScrollPane(fieldHelp);
        scrollBar.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
        scrollBar.setBounds(10, 35, 450, 375);
        tabHelp.add(scrollBar);
    }
    
    public void refreshElements(){
        cbox.removeAllItems();
        addElements(tabBackup.getPath());
    }
    
    public void addElements(String  s){
        File aDirectory = new File(s);
        String[] filesInDir = aDirectory.list();
            for ( int i=0; i<filesInDir.length; i++ )
            {
                String file = filesInDir[i];
                int mid = file.lastIndexOf(".");
                String ext = file.substring(mid+1,file.length());
                if("back".equals(ext)){
                    cbox.addItem(filesInDir[i]);
                }
            }
    }
    
    //Methodes voor login tab
    /**
     * @return the fieldUsername
     */
    public JTextField getFieldUsername() {
        return fieldUsername;
    }

    /**
     * @return the fieldPassword
     */
    public JPasswordField getFieldPassword() {
        return fieldPassword;
    }
    
    //Voor ActionListeners
    @Override
    public void actionPerformed(ActionEvent a) {
        if(a.getSource() == buttonCreateA){
            accountCreate.setVisible(true);
        }
        if(a.getSource() == buttonCreateB){
            tabBackup.createBackup();
            refreshElements();
        }
        if(a.getSource() == buttonLoad){
            try{
                tabBackup.loadBackup(tabBackup.getPath() + "\\" + cbox.getSelectedItem().toString());
                JOptionPane.showMessageDialog(this, "The selected backup has been loaded.");
            } catch (NullPointerException ex){
                JOptionPane.showMessageDialog(this, "No selection found.");
            } catch (Exception e){
                JOptionPane.showMessageDialog(this, "An error has occurred. Make sure the selected file contains valid queries.");
            }
        }
        if(a.getSource() == buttonDeleteB){
            String selectedValue = "";
            boolean nullPointer = false;
            try {
                selectedValue = cbox.getSelectedItem().toString(); //leest de selectie van de gebruiker uit
            } catch (NullPointerException ex){
                JOptionPane.showMessageDialog(this, "Please select a file");
                nullPointer = true;
            }
            if(nullPointer == false){
                File selectedFile = new File(tabBackup.getPath(), selectedValue); //Maakt een File object van het geselecteerde bestand
                if(!selectedFile.exists()){ //kijtkt of het geselecteerde bestand bestaat, zo niet wordt er een foutmelding weergeven
                    JOptionPane.showMessageDialog(this, "Selected file does not exist, it might be possible that the file is already removed");
                } else {
                    if(!selectedFile.canWrite()){ //kijkt of er permissie is om het bestand te verwijderen, zo niet wordt er een foutmelding weergeven
                        JOptionPane.showMessageDialog(this, "Selected file could not be removed");
                    } else {
                        //Er wordt eerst een dialog weergeven waar om een bevesteging wordt gevraagd
                        JOptionPane pane = new JOptionPane("Are you sure you want to delete the selected file?"); //De vraag die gesteld wordt
                        Object[] options = new String[] { "Yes", "No" }; //De antwoorden die gekozen kunnen worden
                        pane.setOptions(options);
                        JDialog dialog = pane.createDialog(new JFrame(), "Delete " + selectedValue);
                        dialog.show();
                        Object obj = pane.getValue(); 
                        int result = -1;
                        for (int k = 0; k < options.length; k++)
                        if (options[k].equals(obj))
                        result = k; //ontvangt de waarde van de gekozen knop, 0 = optie1, 1 = optie2, etc, -1 = het kruisje van sluiten
                        if(result == 0){ //als er op yes gedrukt is wordt het bestand verwijdert en de lijst gerefreshed
                            selectedFile.delete();
                            refreshElements();
                        }
                    }
                }
            }
        }
        if(a.getSource() == buttonCreateQ){
            queryCreate.setVisible(true);
        }
        if(a.getSource() == buttonEdit){
            accountEdit.setVisible(true);
        }
    }
}
